package com.shujia.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Demo03Map {
  def main(args: Array[String]): Unit = {

    /**
     * 通过Scala中的集合构建RDD
     */

    val list1: List[Int] = List[Int](1, 2, 3, 4, 5, 6)

    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo03Map")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    // 将List变为RDD
    val listRDD: RDD[Int] = sc.parallelize(list1)

    /**
     * map算子：转换算子，类似Scala List中的map方法
     * 传入一条数据 返回一条数据
     * 需要接收一个函数f：Int（RDD中数据的类型是Int）=> U(自己定义)
     * 算子的分类：转换算子Transformation、行为算子Action
     * 怎么区分？
     * 通过返回的类型进行区分，RDD ===> RDD 相当于是RDD之间的转换 所以是 转换算子
     * 如果由一个RDD变成其他非RDD类型，则该类算子是行为算子
     *
     * 转换算子vs行为算子
     * 转换算子 是RDD之间的转换 由一个RDD可以得到另一个RDD 但是它是 懒执行的 需要行为算子触发才会执行
     * 行为算子 是将RDD转换成其他非RDD的类型 它可以触发任务的执行 每个行为算子都会触发一个任务Job
     *  Spark任务中的层级划分：
     *  Application -> Job -> Stage -> Task
     */
    val mapRDD: RDD[Int] = listRDD.map(i => i * i)

    mapRDD.foreach(println)

    List[Int](1, 2, 3, 4, 5)
      .map(i => { // 该map是List的方法
        println(s"List中的元素的值为$i")
        i
      })

    sc.parallelize(List[Int](4, 5, 6, 7, 8))
      .map(i => { // 该map是RDD的方法
        println(s"RDD中的元素的值为$i")
        i
      })
      .foreach(println) // 如果没有foreach触发，则map算子不会执行

    while (true) {

    }

  }

}
